package cn.agiledata.bank.transaction.audit.service;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import cn.agiledata.bank.audit.exception.AuditException;
import cn.agiledata.bank.common.util.PageBean;
import cn.agiledata.bank.hibernateBean.Account;
import cn.agiledata.bank.hibernateBean.AuditOperandType;
import cn.agiledata.bank.hibernateBean.EsPrePayTrans;
import cn.agiledata.bank.hibernateBean.Operator;
import cn.agiledata.bank.hibernateBean.SubAccount;
import cn.agiledata.bank.hibernateBean.Transaction;
import cn.agiledata.bank.transaction.exception.TransactionException;
import cn.agiledata.bank.transaction.form.EsPrePayTransForm;
import cn.agiledata.bank.transaction.logic.BatchTransSummary;
import cn.agiledata.bank.transaction.logic.EsPrePayTransBean;

import com.vnv.infrastructure.util.PagingResult;

public interface EsPrePayTransService {

    /**
     * 提交审核操作，进入审核流程
     * 
     * @param eppt
     * @param operator
     * @throws AuditException
     *             如果审核操作过程中出现错误
     */
    public void submitAuditOperation(EsPrePayTrans eppt, Operator operator)
            throws AuditException;

    public void submitAuditAccount(EsPrePayTrans eppt, Account account)
            throws AuditException;

    /**
     * 根据交易id获得零时交易对象
     * 
     * @param id
     * @return
     */
    public EsPrePayTrans getEsPrePayTransById(long id);

    /**
     * 更新或保存零时对象
     * 
     * @param eppt
     */
    public void saveOrUpdate(EsPrePayTrans eppt);

    public EsPrePayTrans updateByType(EsPrePayTransForm eppt,
            HttpServletRequest request);

    public EsPrePayTrans getEsPrePayTransByTransId(String transId);

    /**
     * 判断指定企业预支付交易中的付款方余额是否足够支付该笔交易
     * 
     * @param esPrePayTrans
     *            企业预支付交易
     * @return true if 指定企业预支付交易中的付款方余额足够支付该笔交易, otherwise false
     */
    public boolean enoughDebitBalance(EsPrePayTrans esPrePayTrans);

    /**
     * 根据id查找出一条esprepaytrans对象，并将其逻辑删除
     * 
     * @param id
     */
    public void deleteEsPrePayTrans(long id);

    public boolean requiredAudit(long accountId, String actionType);

    public void createEsPrePayTrans(Transaction trans, Account account,
            Operator operator) throws AuditException;
    
    public EsPrePayTrans updateStatus( EsPrePayTrans tran,
    		HttpServletRequest request);

    public EsPrePayTrans updateByTypeWithoutStatus(EsPrePayTransForm eppt,
            HttpServletRequest request);
    /**
     * 批量最终支付指定批次号的所有交易。该批交易的所有交易都必须为待支付或交易取消，且至少包含一条待支付交易
     * 
     * @param batchNo
     *            批次号
     * @throws TransactionException
     *             如果支付过程中出错错误
     */
    public void batchPayEsPrePayTrans(String batchNo)
            throws TransactionException;

    /**
     * 根据批次号分页查询该批所有交易
     * 
     * @param batchNo
     *            批次号
     * @param pageNo
     *            查询页码
     * @param pageSize
     *            每页记录数
     * @return 分页查询结果
     */
    public PagingResult getEsPrePayTransListByBatchNo(String batchNo,
            int pageNo, int pageSize);

    /**
     * 根据查询条件分页查询批量支付交易摘要列表
     * 
     * @param bean
     *            查询条件bean
     * @return 分页查询结果
     */
    public PageBean getBatchTransSummaryList(EsPrePayTransBean bean);

    /**
     * 根据交易类型获取企业多级审核中的审核对象类型
     * 
     * @param actionType
     *            交易类型
     * @return 审核对象类型
     */
    public AuditOperandType getAuditOperandType(String actionType);

    /**
     * 获取指定批次号的批量支付交易的合计摘要
     * 
     * @param batchNo
     *            批次号
     * @return 批量支付交易的合计摘要
     */
    public BatchTransSummary getBatchTransSummaryTotal(String batchNo);

    /**
     * 获取指定批次号的批量支付交易以交易状态分组的摘要列表
     * 
     * @param batchNo
     *            批次号
     * @return 批量支付交易以交易状态分组的摘要列表
     */
    public BatchTransSummary[] getBatchTransSummaryListGroupByTransStatus(
            String batchNo);

    /**
     * 判断指定批次号的批量支付交易是否可支付
     * 
     * @param batchNo
     *            批次号
     * @return true 指定批次号的批量支付交易可支付, otherwise false
     */
    public boolean batchEsPrePayTransCanBePaid(String batchNo);

    /**
     * 获取指定付款方的指定交易状态的只包含批次号的批量交易摘要列表
     * 
     * @param debit
     *            付款方账户
     * @param transStatus
     *            交易状态
     * @return 只包含批次号的批量交易摘要列表
     */
    public BatchTransSummary[] getBatchTransSummaryListOnlyBatchNo(
            Account debit, String transStatus);
    
    /**
     * 获取制定批次号的交易
     * @param batchNo
     * @return
     */
    public List getEsPrePayTranses(
            String batchNo);
    
    /**
     * 给批量审核的pageList塞入审核拒绝的数字
     * @param batchNo
     * @param summary
     */
    public void setSummary( List summary,Operator oper);
    
    /**
     * 判断该批次的交易是否都是待审核状态，如果有部分被审核过，返回false
     * @param batchNo
     * @return
     */
    public boolean ifAllAudited(String batchNo ,Operator oper);
    
    /**
     * 得到待审核列表
     * @param bean
     * @return
     */
    public PageBean getBatchAuditingTransSummaryList(EsPrePayTransBean bean) ;
    
    /**
     * 得到审核失败列表
     * @param bean
     * @return
     */
    public PageBean getBatchAuditeRejectTransSummaryList(EsPrePayTransBean bean) ;

    public EsPrePayTrans getEsPrePayTransByDebitOrderId(SubAccount debit, String orderId);
    
    /**
     * 创建企业退款交易
     * 
     * @param esPPTran
     * @param account
     * @param operator
     * @throws AuditException
     */
    public void createPreReturnTrans(EsPrePayTrans esPPTran, Account account,
			Operator operator) throws AuditException;
    
    public List getEsPrePayTransListByBatchNo(String batchNo);
}